﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using MySql.Data.MySqlClient;
using equinoxWeb.Models;

namespace equinoxWeb.GestionConexion
{
    public class FacturacionFunction
    {
        public static int getNextId()
        {
            int idDetalleFacturacion = 0;
            GestorConexion gestor = new GestorConexion();
            gestor.OpenConnection();
            MySqlConnection con = gestor.Connection;
            MySqlCommand cmd;
            cmd = new MySqlCommand("select idfacturacion from facturacion order by idfacturacion desc LIMIT 1 ", con);
            cmd.Prepare();
            MySqlDataReader res = cmd.ExecuteReader();
            if (res.Read())
            {
                idDetalleFacturacion = res.GetInt32(0);
            }
            else
            {
                idDetalleFacturacion = 0;
            }
            idDetalleFacturacion++;
            res.Close();
            gestor.CloseConnection();
            return idDetalleFacturacion;
        }

        public static List<DetalleFacturacion> listaDetalleFacturacion(int idCaso, int idFacturacion)
        {
            List<DetalleFacturacion> lista = new List<DetalleFacturacion>();
            GestorConexion gestor = new GestorConexion();
            gestor.OpenConnection();
            MySqlConnection con = gestor.Connection;
            MySqlCommand cmd;
            cmd = new MySqlCommand("select iddetallefacturacion ,idcaso,descripcion,costo, DATE_FORMAT(fecha,'%d/%m/%Y'), horainicio, horafin, surveyor,tipocosto,horassubtotales  from detallefacturacion where idcaso=@idCaso and idfacturacion=@idfacturacion ", con);
            cmd.Parameters.AddWithValue("@idCaso", idCaso);
            cmd.Parameters.AddWithValue("@idfacturacion", idFacturacion);
            cmd.Prepare();
            MySqlDataReader res = cmd.ExecuteReader();
            while (res.Read())
            {
                DetalleFacturacion facturacionDetalle = new DetalleFacturacion();
                facturacionDetalle.IdDetalleFacturacion = res.GetInt32("iddetallefacturacion");
                facturacionDetalle.Descripcion = res.IsDBNull(2) ? "" : res.GetString("descripcion");
                facturacionDetalle.Costo = res.IsDBNull(3) ? 0 : res.GetFloat("costo");
                facturacionDetalle.Fecha = res.IsDBNull(4) ? "" : res.GetString(4);
                facturacionDetalle.HoraIni = res.IsDBNull(5) ? "" : res.GetString("horaInicio");
                facturacionDetalle.HoraFin = res.IsDBNull(6) ? "" : res.GetString("horaFin");
                facturacionDetalle.Surveyor = res.IsDBNull(7) ? "" : res.GetString("surveyor");
                facturacionDetalle.TipoCosto = res.IsDBNull(8) ? 0 : res.GetInt32(8);
                facturacionDetalle.HorasSubtotales = res.IsDBNull(9) ? 0 : res.GetFloat("horassubtotales");
                lista.Add(facturacionDetalle);
            }
            res.Close();
            gestor.CloseConnection();
            return lista;
        }
        public static void agregarDetalleFacturacion(Facturacion facturacionModel,MySqlConnection con)
        {
            List<DetalleFacturacion> detallesFacturacion = facturacionModel.DetallesFacturacion;
            for (int i = 0; i < detallesFacturacion.ToArray().Length; i++)
            {
                MySqlCommand cmd;
                DetalleFacturacion lineaFacturacionModel = detallesFacturacion.ElementAt(i);
                cmd = new MySqlCommand("Insert into detallefacturacion (iddetallefacturacion,idfacturacion ,idcaso,descripcion,costo, fecha, horainicio, horafin, surveyor,tipocosto,horassubtotales) " +
                    "values (@iddetallefacturacion,@idfacturacion ,@idcaso,@descripcion,@costo, STR_TO_DATE(@fecha,'%d/%m/%Y'), @horainicio, @horafin, @surveyor,@tipocosto,@horassubtotales)", con);
                cmd.Parameters.AddWithValue("@iddetallefacturacion", lineaFacturacionModel.IdDetalleFacturacion);
                cmd.Parameters.AddWithValue("@idfacturacion", facturacionModel.IdFacturacion);
                cmd.Parameters.AddWithValue("@idcaso", facturacionModel.IdCaso);
                cmd.Parameters.AddWithValue("@descripcion", lineaFacturacionModel.Descripcion);
                cmd.Parameters.AddWithValue("@costo", lineaFacturacionModel.Costo);
                cmd.Parameters.AddWithValue("@fecha", lineaFacturacionModel.Fecha);
                cmd.Parameters.AddWithValue("@horainicio", lineaFacturacionModel.HoraIni);
                cmd.Parameters.AddWithValue("@horafin", lineaFacturacionModel.HoraFin);
                cmd.Parameters.AddWithValue("@surveyor", lineaFacturacionModel.Surveyor);
                cmd.Parameters.AddWithValue("@tipocosto", lineaFacturacionModel.TipoCosto);
                cmd.Parameters.AddWithValue("@horassubtotales", lineaFacturacionModel.HorasSubtotales);

                cmd.Prepare();
                cmd.ExecuteNonQuery();
            }
        }

        public static void eliminarLineas(int idCaso, int idFacturacion, MySqlConnection con)
        {
            MySqlCommand cmd;
            cmd = new MySqlCommand("delete from detallefacturacion where idCaso=@idCaso and idfacturacion=@idfacturacion ", con);
            cmd.Parameters.AddWithValue("@idfacturacion", idFacturacion);
            cmd.Parameters.AddWithValue("@idcaso", idCaso);
            cmd.Prepare();
            cmd.ExecuteNonQuery();
        }

        public static void agregarFacturacion(Facturacion facturacionModel, bool nuevo)
        {
            GestorConexion gestor = new GestorConexion();
            gestor.OpenConnection();
            MySqlConnection con = gestor.Connection;
            MySqlTransaction tran = con.BeginTransaction();
            try
            {
                string comando = "";
                if (nuevo)
                {
                    comando = "Insert into facturacion (idfacturacion ,idcaso,rate,expenses,tipocambiosoles,idmoneda,facturara) " +
                    "values (@idfacturacion ,@idcaso,@rate,@expenses,@tipocambiosoles,@idmoneda,@facturara)";
                    facturacionModel.IdFacturacion = getNextId();
                }
                else
                {
                    comando = "Update facturacion set rate=@rate,expenses=@expenses,tipocambiosoles=@tipocambiosoles,idmoneda=@idmoneda, facturara=@facturara "+
                        " where idfacturacion=@idfacturacion and idCaso = @idcaso ";
                    eliminarLineas(facturacionModel.IdCaso, facturacionModel.IdFacturacion, con);
                }

                MySqlCommand cmd;
                cmd = new MySqlCommand(comando, con);
                cmd.Parameters.AddWithValue("@idfacturacion", facturacionModel.IdFacturacion);
                cmd.Parameters.AddWithValue("@idcaso", facturacionModel.IdCaso);
                cmd.Parameters.AddWithValue("@facturara", facturacionModel.Facturara);
                cmd.Parameters.AddWithValue("@rate", facturacionModel.Rate);
                cmd.Parameters.AddWithValue("@expenses", facturacionModel.Expenses);
                cmd.Parameters.AddWithValue("@tipocambiosoles", facturacionModel.TipoCambioSoles);
                cmd.Parameters.AddWithValue("@idmoneda", facturacionModel.IdMoneda);
                cmd.Prepare();
                cmd.ExecuteNonQuery();

                agregarDetalleFacturacion(facturacionModel,con);
                tran.Commit();
                gestor.CloseConnection();

            }
            catch (Exception ex)
            {
                tran.Rollback();
                throw ex;
            }

        }

        public static List<DetalleFacturacion> crearListaDetalles(string[] fecha, string[] horaDesde, string[] horaHasta, float[] nHoras, 
            string[] descripcion, string[] surveyor, float[] costo,int [] tipoCosto)
        {
            List<DetalleFacturacion> listaDetalle = new List<DetalleFacturacion>();
            for (int i = 0; i < fecha.Length; i++)
            {
                DetalleFacturacion aux = new DetalleFacturacion();
                aux.IdDetalleFacturacion = i + 1;
                aux.Fecha = fecha[i];
                aux.HoraIni = horaDesde[i].Substring(0,5);
                aux.HoraFin = horaHasta[i].Substring(0, 5);
                aux.HorasSubtotales = nHoras[i];
                aux.Descripcion = descripcion[i];
                aux.Surveyor = surveyor[i];
                aux.Costo = costo[i];
                aux.TipoCosto = tipoCosto[i];
                listaDetalle.Add(aux);
            }
            return listaDetalle;
        }

        public static Facturacion abrirFacturacion(int idCaso, int idFacturacion)
        {
            Facturacion facturacion = new Facturacion();

            List<DetalleFacturacion> lista = new List<DetalleFacturacion>();
            GestorConexion gestor = new GestorConexion();
            gestor.OpenConnection();
            MySqlConnection con = gestor.Connection;
            MySqlCommand cmd;
            cmd = new MySqlCommand("select rate,expenses,facturacion.idmoneda,tipocambiosoles,moneda.nombre,CONCAT(CAST(caso.nReferencia AS CHAR),'/',cliente.codigoCliente,'/',SUBSTRING(caso.year,3)),facturara from facturacion,caso,moneda,cliente where facturacion.idcaso=@idCaso and idfacturacion=@idfacturacion and facturacion.idmoneda=moneda.idmoneda and facturacion.idCaso=caso.idCaso and caso.idcliente=cliente.idcliente ", con);
            cmd.Parameters.AddWithValue("@idCaso", idCaso);
            cmd.Parameters.AddWithValue("@idfacturacion", idFacturacion);
            cmd.Prepare();
            MySqlDataReader res = cmd.ExecuteReader();
            if (res.Read())
            {
                facturacion.IdCaso = idCaso;
                facturacion.Rate = res.IsDBNull(0) ? 0 : res.GetFloat(0);
                facturacion.Expenses = res.IsDBNull(1) ? 0 : res.GetFloat(1);
                facturacion.IdMoneda = res.IsDBNull(2) ? 1 : res.GetInt32(2);
                facturacion.TipoCambioSoles = res.IsDBNull(3) ? 1 : res.GetInt32(3);
                facturacion.Moneda = res.IsDBNull(4) ? "" : res.GetString(4);
                facturacion.ReferenciaCaso = res.IsDBNull(5) ? "" : res.GetString(5);
                facturacion.Facturara = res.IsDBNull(6) ? "" : res.GetString(6);
                facturacion.TotalTravel = getCostoTotal(idCaso, idFacturacion, 1);
                facturacion.TotalWork = getCostoTotal(idCaso, idFacturacion, 2);
            }
            res.Close();
            gestor.CloseConnection();
			facturacion.IdFacturacion = idFacturacion;
            facturacion.DetallesFacturacion = listaDetalleFacturacion(idCaso, idFacturacion);
            return facturacion;
        }
    
		public static List<Facturacion> listaFacturacion(int idCaso)
        {
            List<Facturacion> lista = new List<Facturacion>();
            GestorConexion gestor = new GestorConexion();
            gestor.OpenConnection();
            MySqlConnection con = gestor.Connection;
            MySqlCommand cmd;
            cmd = new MySqlCommand("select rate,expenses,facturacion.idmoneda,tipocambiosoles,moneda.nombre,CONCAT(CAST(caso.nReferencia AS CHAR),'/',cliente.codigoCliente,'/',SUBSTRING(caso.year,3)),idFacturacion from facturacion,caso,moneda,cliente where facturacion.idcaso=@idCaso and facturacion.idmoneda=moneda.idmoneda and facturacion.idCaso=caso.idCaso and caso.idcliente=cliente.idcliente ", con);
            cmd.Parameters.AddWithValue("@idCaso", idCaso);
            cmd.Prepare();
            MySqlDataReader res = cmd.ExecuteReader();
            while (res.Read())
            {
				Facturacion facturacion = new Facturacion();
                int idFacturacion = res.IsDBNull(6) ? 0 : res.GetInt32(6);
                facturacion.IdCaso = idCaso;
                facturacion.IdFacturacion = idFacturacion;
                facturacion.Rate = res.IsDBNull(0) ? 0 : res.GetFloat(0);
                facturacion.Expenses = res.IsDBNull(1) ? 0 : res.GetFloat(1);
                facturacion.IdMoneda = res.IsDBNull(2) ? 1 : res.GetInt32(2);
                facturacion.TipoCambioSoles = res.IsDBNull(3) ? 1 : res.GetInt32(3);
                facturacion.Moneda = res.IsDBNull(4) ? "" : res.GetString(4);
                facturacion.ReferenciaCaso = res.IsDBNull(5) ? "" : res.GetString(5);
                facturacion.TotalTravel = getCostoTotal(idCaso, idFacturacion, Constantes.TipoCostoTravelling);
                facturacion.TotalWork = getCostoTotal(idCaso, idFacturacion, Constantes.TipoCostoWorking);
                lista.Add(facturacion);
            }
            res.Close();
            gestor.CloseConnection();
            return lista;
        }
        static private float getCostoTotal(int idCaso, int idFacturacion, int tipoCosto)
        {
            float costo = 0;
            GestorConexion gestor = new GestorConexion();
            gestor.OpenConnection();
            MySqlConnection con = gestor.Connection;
            MySqlCommand cmd;
            cmd = new MySqlCommand("select COALESCE(sum(costo), 0) from detallefacturacion where idCaso=@idCaso and idfacturacion=@idFacturacion and tipocosto=@tipoCosto ", con);
            cmd.Parameters.AddWithValue("@idCaso", idCaso);
            cmd.Parameters.AddWithValue("@idFacturacion", idFacturacion);
            cmd.Parameters.AddWithValue("@tipocosto", tipoCosto);
            cmd.Prepare();
            MySqlDataReader res = cmd.ExecuteReader();
            while (res.Read())
            {
                costo = res.IsDBNull(0) ? 0 : res.GetFloat(0);
            }
            res.Close();
            gestor.CloseConnection();

            return costo;
        }
	}
}
